package pe.com.casadesign.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;
import org.springframework.stereotype.Repository;

import pe.com.casadesign.dao.TipoDocumentoVentaDAO;
import pe.com.casadesign.domain.ListaTipoDocumentoVenta;
import pe.com.casadesign.domain.TipoDocumentoVenta;

/**
 * Implementacion de TipoDocumentoVentaDAO.
 * 
 * @author Pedro Vera
 * 
 */
@Repository
public class TipoDocumentoVentaDAOImpl implements TipoDocumentoVentaDAO {
	private static final Logger logger = LoggerFactory.getLogger(TipoDocumentoVentaDAOImpl.class);
	
	// Nombre Procedimientos Almacenados
	private static String SP_LISTAR_TIPO_DOCUMENTO_VENTA = "SP_LISTAR_TIPO_DOCUMENTO_VENTA";
		
	// Parametros de Salida
	private static String CODTIPODOCUMENTOVENTA = "CODTIPODOCUMENTOVENTA";
	private static String DESCRIPCION = "DESCRIPCION";
	
	private static String LISTADO = "LISTADO";
	
	private JdbcTemplate jdbcTemplate;
	
	@Autowired
    public void setDataSource(DataSource dataSource)
    {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }
	
	@Override
	public ListaTipoDocumentoVenta listarTipoDocumentoVenta() {
		logger.info("ListaTipoDocumentoVenta");

		// Instanciando variable para llamado de SP
	    SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate).withProcedureName(SP_LISTAR_TIPO_DOCUMENTO_VENTA).
	    						  returningResultSet(LISTADO, new RowMapper<TipoDocumentoVenta>(){
									@Override
									public TipoDocumentoVenta mapRow(final ResultSet rs, final int numRow) throws SQLException
								    {
								        final TipoDocumentoVenta tipoDocumentoVenta = new TipoDocumentoVenta();
								        tipoDocumentoVenta.setCodigo(rs.getInt(CODTIPODOCUMENTOVENTA));
								        tipoDocumentoVenta.setDescripcion(rs.getString(DESCRIPCION));
								        return tipoDocumentoVenta;
								    }
	    						  }
								);

	    // Estableciendo parametros de entrada al SP
	    SqlParameterSource parametros = new MapSqlParameterSource(); 

	    // Establecer parametros y ejecutar SP
        Map<String,Object> data = llamarSP.execute(parametros);

        // Obteniendo lista generada de ejecutar SP
		@SuppressWarnings("unchecked")
		List<TipoDocumentoVenta> listaTipoDocumentoVenta= (List<TipoDocumentoVenta>)data.get(LISTADO);
        
		// Instanciando objeto TipoDocumentoVenta
		ListaTipoDocumentoVenta listaTipoDocumentoVentaResultado = new ListaTipoDocumentoVenta();
        // Estableciendo resultado al objeto ListaTipoDocumentoVentaResultado
		listaTipoDocumentoVentaResultado.setLista(listaTipoDocumentoVenta);
        
        if (logger.isDebugEnabled() && listaTipoDocumentoVentaResultado != null)
        {
            logger.debug("size=" + listaTipoDocumentoVentaResultado.size());
        }
        return listaTipoDocumentoVentaResultado;
	}

}